#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int main(int argc, char const *argv[])
{
  /* code */
  // 1. 创建数组的几种常用方法
  vector<int> empty; // empty 是一个空数组
  vector<int> array {1, 2, 3, 4}; // 按照字面量创建数组
  vector<int> array1(10, 1); // array1 里 10 个 1

  // 2. 两个查询操作
  array.size(); // 查询元素个数
  array.empty(); // 查询数组是否为空

  // 3. 和数组位置有关的
  // 3.1 正向迭代器
  vector<int>::iterator pos1 = array.begin(); // 左边开始的起始位置
  vector<int>::iterator pos2 = array.end(); // 左边开始的结束位置

  *pos1; // 读取位置上的元素

  // 基于数字的方法读取
  array[0]; // *pos1
  array.at(0);

  // 3.2 逆向迭代器
  //   {1, 2, 3, 4, 5}
  // ^ rend()
  vector<int>::reverse_iterator rPos1 = array.rbegin();
  vector<int>::reverse_iterator rPos2 = array.rend();

  *rPos1;

  // 4. 修改
  // 4.1 追加元素
  array1.push_back(11); // 把 11 添加到 array1 的末尾

  // 4.2 删除末尾的元素
  array.pop_back();

  // 4.3 在数组的中间位置插入元素
  // insert 家族函数
  // 所有插入元素的函数都只能基于迭代器表达的位置进行操作
  // 在插入的位置之前，插入元素
  array1.insert(array1.begin() /* 插入的位置 */, 0 /*插入的值*/);
  array1.insert(array1.begin() /* 插入的位置 */, 5 /*插入的元素个数*/, -1 /*插入的值*/);
  array1.insert(array1.end(), {6, 7, 8, 9, 10});

  // 4.4 删除
  array1.erase(array1.begin() + 3 /*要删除的位置*/);
  array1.clear(); // 清空数组

  return 0;
}
